package com.imut.lagain.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.client.RestTemplate;

/**
 * 微信配置类
 */
@Configuration
@ConfigurationProperties(prefix = "wechat")
@Data
public class WeChatConfig {
    private static final Logger log = LoggerFactory.getLogger(WeChatConfig.class);

    /**
     * 微信小程序AppID
     */
    private String appid;

    /**
     * 微信小程序AppSecret
     */
    private String secret;

    /**
     * 获取小程序AppID
     */
    public String getMiniProgramAppId() {
        return appid; // 假设小程序AppId与公众号AppId相同，实际情况可能不同
    }

    /**
     * 获取AppID
     */
    public String getAppid() {
        return appid;
    }

    /**
     * 获取Secret
     */
    public String getSecret() {
        return secret;
    }

    /**
     * 获取API基础URL
     */
    public String getApiBaseUrl() {
        return apiBaseUrl;
    }

    /**
     * 微信小程序消息推送Token
     */
    private String token;

    /**
     * 微信小程序消息推送EncodingAESKey
     */
    private String mpEncodingAESKey;

    /**
     * 微信API基础URL
     */
    private String apiBaseUrl = "https://api.weixin.qq.com";

    /**
     * 获取access_token的URL路径
     */
    private String tokenUrl = "/cgi-bin/token";

    /**
     * 小程序登录凭证校验URL路径
     */
    private String jscode2sessionUrl = "/sns/jscode2session";

    /**
     * 获取用户手机号URL路径
     */
    private String getPhoneNumberUrl = "/wxa/business/getuserphonenumber";

    /**
     * 发送模板消息URL路径
     */
    private String sendMessageUrl = "/cgi-bin/message/subscribe/send";

    /**
     * 删除模板消息URL路径
     */
    private String deleteTemplateUrl = "/cgi-bin/template/del_private_template";

    /**
     * 获取不限制的小程序码URL路径
     */
    private String getUnlimitedUrl = "/wxa/getwxacodeunlimit";

    /**
     * Token缓存时间（秒）
     */
    private long tokenCacheTime = 7000;

    /**
     * 请求超时时间（毫秒）
     */
    private int requestTimeout = 10000;

    /**
     * 重试次数
     */
    private int retryCount = 3;

    /**
     * Redis缓存Key前缀
     */
    public static final String REDIS_KEY_PREFIX = "wechat:";

    /**
     * 创建微信专用的WebClient
     */
    @Bean("weChatWebClient")
    public WebClient weChatWebClient() {
        return WebClient.builder()
                .baseUrl(apiBaseUrl)
                .codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(10 * 1024 * 1024))
                .build();
    }

    /**
     * 创建微信专用的RestTemplate
     */
    @Bean("weChatRestTemplate")
    public RestTemplate weChatRestTemplate() {
        return new RestTemplate();
    }

    /**
     * 获取完整的Token URL
     */
    public String getFullTokenUrl() {
        return apiBaseUrl + tokenUrl;
    }

    /**
     * 获取完整的jscode2session URL
     */
    public String getFullJscode2sessionUrl() {
        return apiBaseUrl + jscode2sessionUrl;
    }

    /**
     * 获取完整的获取手机号URL
     */
    public String getFullGetPhoneNumberUrl() {
        return apiBaseUrl + getPhoneNumberUrl;
    }

    /**
     * 获取完整的发送消息URL
     */
    public String getFullSendMessageUrl() {
        return apiBaseUrl + sendMessageUrl;
    }

    /**
     * 获取完整的删除模板URL
     */
    public String getFullDeleteTemplateUrl() {
        return apiBaseUrl + deleteTemplateUrl;
    }

    /**
     * 获取完整的获取小程序码URL
     */
    public String getFullGetUnlimitedUrl() {
        return apiBaseUrl + getUnlimitedUrl;
    }

    /**
     * 验证配置是否有效
     */
    public boolean isConfigValid() {
        return appid != null && !appid.trim().isEmpty() 
            && secret != null && !secret.trim().isEmpty();
    }

    /**
     * 获取配置信息（脱敏）
     */
    public String getConfigInfo() {
        return String.format("WeChat Config - AppID: %s, Secret: %s, BaseURL: %s", 
                appid != null ? appid.substring(0, Math.min(appid.length(), 8)) + "***" : "null",
                secret != null ? "***" : "null",
                apiBaseUrl);
    }

    /**
     * Access Token缓存Key
     */
    public static final String ACCESS_TOKEN_KEY = REDIS_KEY_PREFIX + "access_token";

    /**
     * 用户Session缓存Key前缀
     */
    public static final String USER_SESSION_KEY_PREFIX = REDIS_KEY_PREFIX + "user_session:";

    /**
     * 模板消息发送频率限制Key前缀
     */
    public static final String TEMPLATE_RATE_LIMIT_KEY_PREFIX = REDIS_KEY_PREFIX + "template_rate_limit:";
}